package com.mycode.chainOfResponsibility14;

import com.mycode.chainOfResponsibility14.resolve.*;

/**
 * 责任链模式：避免将请求发送者与接收者耦合在一起，让多个对象都有机会接收请求，将这些对象连接成一条链，并沿着这条链传递请求
 * 责任链模式可分为：纯责任链模式 和 不纯的责任链模式
 *   纯责任链模式：一个具体处理者对象只能在两个行为中选择一个，要么承担全部责任，要么将责任推给下架，不允许出现某个具体处理者对象承担一部分责任后又将责任向下传递
 *   不纯责任链模式：允许某个请求被一个具体处理者部分处理后再向下传递，或者一个具体处理这处理完某请求后其后继处理者可以继续处理该请求
 *
 * 主要优点：
 *     1、责任链模式使得一个对象无需知道是其他哪个对象处理其请求，对象仅需知道该请求会被处理即可，降低系统的耦合度
 *     2、请求处理对象仅需维持一个指向其后继者的引用，而不需要维持它对所有候选处理者的引用，简化对象的相互连接
 *     3、在给对象分派职责时，责任链可以提供更多的灵活性，可以通过在运行时对链进行动态的增加或修改
 *     4、系统中增加一个新的具体请求处理者时无需修改原有系统的代码，只需要在客户端重新建链即可
 *
 * 主要缺点：
 *     1、请求没有明确接收者，不能保证一定会被处理
 *     2、对于比较长的责任链，请求的处理可能涉及多个处理对象，系统性能将受到一定影响，代码调试不太方便
 *     3、如果建链不当，可能会造成循环调用，将导致系统陷入死循环
 *
 * 适用场景：
 *     1、有多个对象可以处理同一个请求，具体那个对象处理该请求待运行时刻在确定
 *     2、在不明确指定接受者的情况下，向多个对象中的一个提交一个请求
 *     3、可动态指定一组对象处理请求，客户端可以动态创建责任链来处理请求，还可以改变链中处理者之间的先后次序
 */
public class Bootstrap {

    public static void main(String[] args) {
        Approver director = new Director("张三(主任)");
        Approver vicePresident = new VicePresident("李四(副董事长)");
        Approver president = new President("赵柳(董事长)");
        Approver congress = new Congress("董事会");
        //创建职责链
        director.setSuccessor(vicePresident);
        vicePresident.setSuccessor(president);
        president.setSuccessor(congress);

        // 创建采购单
        PurchaseRequest purchaseRequest1 = new PurchaseRequest(45000, 10001, "买把倚天剑");
        director.processRequest(purchaseRequest1);

        PurchaseRequest purchaseRequest2 = new PurchaseRequest(60000, 10002, "打瓶酱油");
        director.processRequest(purchaseRequest2);

        PurchaseRequest purchaseRequest3 = new PurchaseRequest(145000, 10003, "来把屠龙刀");
        director.processRequest(purchaseRequest3);

        PurchaseRequest purchaseRequest4 = new PurchaseRequest(4500000, 10004, "买个岛");
        director.processRequest(purchaseRequest4);


    }
}
